package br.com.petshop.dao;

import br.com.petshop.entidades.Cliente;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Sidney
 * @version 1.0
 * @see GenericDAO
 * Esta classe contem os metodos basicos para manipulacao do banco de dados, extende a classe GenericDAO e tem
 * como proposito manipular a tabela cliente no banco de dados.
 */
public class ClienteDAO extends GenericDAO {

    //metodo para adicionar um cliente a base de dados
    public int adicionarCliente(Cliente cliente) throws SQLException {
        cliente.setId(getNextId("cliente"));
        String query = "INSERT INTO petshop.cliente(ID,Nome,Idade,Endereco,Telefone,Cep,Cidade,Uf)VALUES(?,?,?,?,?,?,?,?)";
        executeCommand(query, cliente.getId(), cliente.getNome(), cliente.getIdade(), cliente.getEndereco(),
                cliente.getTelefone(), cliente.getCep(), cliente.getCidade(), cliente.getUf());
        return cliente.getId();
    }

    public void removeCliente(int idCliente) throws SQLException {
        executeCommand("DELETE FROM petshop.cliente WHERE ID = ?", idCliente);
    }

    public void atualizarCliente(Cliente cliente) throws SQLException {
        String query = "UPDATE petshop.cliente SET Nome =?, Idade = ?, Endereco =?, Telefone = ?, Cep = ?,Cidade = ?, Uf = ? WHERE ID = ?";
        executeCommand(query, cliente.getNome(), cliente.getIdade(), cliente.getEndereco(), cliente.getTelefone(),
                cliente.getCep(), cliente.getCidade(), cliente.getUf(), cliente.getId());
    }

    public Cliente getCliente(int idCliente) throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM petshop.cliente WHERE Id = ?", idCliente);
        Cliente cliente = null;
        if (rs.next()) {
            cliente = populateCliente(rs);
        }
        rs.close();
        return cliente;
    }

    public static Cliente populateCliente(ResultSet rs) throws SQLException {
        Cliente clienteRetornado = new Cliente();
        clienteRetornado.setId(rs.getInt("Id"));
        clienteRetornado.setNome(rs.getString("Nome"));
        clienteRetornado.setIdade(rs.getInt("Idade"));
        clienteRetornado.setEndereco(rs.getString("Endereco"));
        clienteRetornado.setTelefone(rs.getString("Telefone"));
        clienteRetornado.setCep(rs.getString("Cep"));
        clienteRetornado.setCidade(rs.getString("Cidade"));
        clienteRetornado.setUf(rs.getString("Uf"));
        return clienteRetornado;

    }

    /**
     * Este metodo permite especificar em uma busca o nome do cliente que se esta procurando.
     * @param nome
     * @return
     * @throws SQLException 
     */
    public List<Cliente> getAllClientsByName(String nome) throws SQLException {
        List<Cliente> clientRetornado = new LinkedList<Cliente>();
        ResultSet rs = executeQuery("SELECT * FROM petshop.cliente WHERE Nome LIKE ?" , "%" + nome + "%");
        while (rs.next()) {
            clientRetornado.add(populateCliente(rs));
        }
        return clientRetornado;
    }
    
    //metodo ainda nao testado
    public List<Cliente> getTodosOsClientes() throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM cliente");
        List<Cliente> cliRetornado = new LinkedList<Cliente>();
        while(rs.next()){
            cliRetornado.add(populateCliente(rs));
        }
        rs.close();
        return cliRetornado;
    }
}
